#pragma once

#include "Command/Command.hpp"

#include <vector>
#include <iostream>

using namespace std;

class Command;

/** @class CommandStack
  * @brief Класс, реализующий стек команд
  *
  * Предназначен для хранения истории команд, их выполнения и отмены.
  */
class CommandStack
{
    int curComInd;  ///< Индекс текущей команды
    vector<Command*> commands;  ///< История команд
public:
    /**
      * Конструктор
      */
    CommandStack();

    /**
      * Процедура добавления новой команды в список истории
      * В случае, если curComInd меньше индекса последней команды в списке команд commands,
      * Все команды в commands с индексом, большим чем curComInd, удаляются из истории, и новая команда становится последней.
      * В противном случае новая команда просто добавляется в конец.
      * После добавление в список истории, команда выполняется.
      *
      * @param com Добавляемая команда
      */
    void addCommand(Command *com);

    /**
      * Отменить действие
      * У команды с индексом curComInd вызывается действие unexecute(), curComInd уменьшается на 1.
      */
    void undo();

    /**
      * Повторить действие
      * У команды с индексом curComInd+1 вызывается действие execute(), curComInd увеличивается на 1.
      */
    void redo();

    //void printStack(){cout << "stack:\n";for(auto i=commands.begin();i!=commands.end();++i) (*i)->execute();}

};
